package com.itheima.d5_generics;

import java.util.ArrayList;

/**
 * 泛型：
 *  定义类、接口、方法时，同时声明了一个或者多个类型变量（如：<E>） ，称为泛型类、泛型接口，泛型方法、它们统称为泛型。
 *  public class ArrayList<E>{
 *     . . .
 * }
 * 修饰符 class 类名<类型变量，类型变量，…> {
 *
 * }
 *比如我们前面学过的ArrayList类就是一个泛型类，我们可以打开API文档看一下ArrayList类的声明。
 * java.util.ArrayList<E>
 *     这里的<E>就是泛型，表示元素的数据类型
 *  ArrayList集合的设计者在定义ArrayList集合时，就已经明确ArrayList集合时给别人装数据用的，
 * 但是别人用ArrayList集合时候，装什么类型的数据他不知道，所以就用一个`<E>`表示元素的数据类型。
 *当别人使用ArrayList集合创建对象时，`new ArrayList<String> `就表示元素为String类型，`new ArrayList<Integer>`表示元素为Integer类型。
 *
 * 泛型的好处：在编译阶段可以避免出现一些非法的数据
 * 作用：泛型提供了在编译阶段约束所能操作的数据类型，并自动进行检查的能力！这样可以避免强制类型转换，及其可能出现的异常。
 *  泛型的本质：把具体的数据类型作为参数传给类型变量。
 */
public class Test1 {
    public static void main(String[] args) {
        // 目标：认识泛型
        ArrayList list = new ArrayList();
        list.add("java1");
        list.add("java2");
        list.add("java3");
         //list.add(new Cat());

        for (int i = 0; i < list.size(); i++) {
            String e = (String) list.get(i);
            System.out.println(e);
        }


        System.out.println("-----------------------------------");
//        ArrayList<String> list1 = new ArrayList<String>();// JDK 1.7开始，后面的数据类型可以不声明
        //<>里面的就是泛型，泛型可以约束我们能够操作的数据类型。把具体的数据类型String作为参数传给“类型变量”E了，也就是arraylist源码里面的那个
        ArrayList<String> list1 = new ArrayList<>();
        list1.add("java1");
        list1.add("java2");
        list1.add("java3");

        //<>里面的就是泛型，这里指定了接收Cat类型的变量，把具体的数据类型Cat作为参数传给“类型变量”E了
        ArrayList<Cat> list2 = new ArrayList<>();
        list2.add(new Cat());

        for (int i = 0; i < list1.size(); i++) {
            String e = list1.get(i);
            System.out.println(e);
        }

    }
}

class Cat{}



